Fork me on GitHub

线程间通信

注意:所有文章除特别说明外,转载请注明出处.

[TOC]

第三章 线程间通信

3.1 等待/通知机制

3.1.3 等待/通知机制的实现

wait()方法是使当前执行程序的线程进入等待状态,wait()方法是Object类方法,该方法用来将当前线程置入“预执行队列”中。

如果在使用该方法前没有 同步加锁 将会弹出异常 Exception in thread “main” java.lang.IllegalMonitorStateException 。

提示:只能在同步方法或同步块中调用wait()方法,在执行wait()方法后,当前线程释放锁。

notify()方法也要在同步块或同步方法中调用,在调用前需要获得该对象的对象级别锁。

提示:该方法是用来提示那些可能等待该对象的对象锁的其它线程,如果有多个线程等待,则由线程规划器随机挑选出其中一个呈wait()状态的线程,对其发出通知notify(),并使它等待获取该对象的对象锁。

注意:在执行notify()方法之后,不会立即获取该对象锁,要等到执行notify()的线程将程序执行完之后,退出synchronize块之后释放锁。

总结:wait()使线程停止运行,notify()使停止的线程继续执行。

关键字synchronize可以将任何一个Object对象作为同步对象看待,而Java为每个Object对象都实现了wait()方法和notify()方法,它们必须用在被 synchronize 同步的Object临界区内。

通过wait()方法可以使处于临界区内的线程进入等待状态,同时释放被同步对象的锁。notify()方法可以唤醒一个因调用了wait()操作处于阻塞状态的线程,使其进入就绪状态。

3.1.4 wait()方法锁释放 | notify()方法锁不释放

当方法wait()被执行后,锁被自动释放,但执行完notify()方法后,锁不自动释放。

提示:必须执行完notify()方法所在的同步synchronize代码块之后才释放锁。

3.1.5 interrupt()方法遇到wait()方法

当线程处于wait()状态时,调用线程对象的 interrupt()方法会出现 InterruptedException 异常。

3.2 方法join使用

方法join()的作用是:使所属的线程对象x正常执行run()方法中的任务,而使当前线程z进行无限期的阻塞,等待线程x销毁后再继续执行线程z后面的程序。

方法join()具有使线程排队运行的作用,有些类似同步的运行效果。join()方法与synchronize的区别是:join在内部使用wait()方法进行等待,而synchronize关键字使用的是“对象监视器”原理作为同步。

3.3 类ThreadLocal使用

类ThreadLocal主要解决每个线程绑定自己的值,可以将ThreadLocal类比喻成全局存放数据的盒子,盒子中可以存储每个线程的私有数据。

提示:类ThreadLocal解决的是变量在不同线程间的隔离性,即就是不同线程拥有自己的值,不同线程的值可以放入 ThreadLocal 类中进行保存。

3.3.2 验证线程变量的隔离性

3.4 类InheritableThreadLocal的使用

使用类 InheritableThreadLocal 可以在子线程中取得父线程继承下来的值。

本文标题:线程间通信

文章作者:Bangjin-Hu

发布时间:2019年10月15日 - 09:22:26

最后更新:2020年03月29日 - 11:39:06

原始链接:http://bangjinhu.github.io/undefined/第三章 线程间通信/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Bangjin-Hu wechat
欢迎扫码关注微信公众号,订阅我的微信公众号.
坚持原创技术分享,您的支持是我创作的动力.